package com.learning.server.design;

/**
 * 1、需要扩展一个类的功能。
 2、动态的为一个对象增加功能，而且还能动态撤销。（继承不能做到这一点，继承的功能是静态的，不能动态增删。）
 缺点：产生过多相似的对象，不易排错！
 */

interface DSourceable {
    public void method();
}

class DSource implements DSourceable {

    @Override
    public void method() {
        System.out.println("the original method!");
    }
}

public class Decorator implements DSourceable {

    private DSourceable source;

    public Decorator(DSourceable source){
        super();
        this.source = source;
    }

    @Override
    public void method() {
        System.out.println("before decorator!");
        source.method();
        System.out.println("after decorator!");
    }


    public static void main(String[] args) {
        DSourceable source = new DSource();
        DSourceable obj = new Decorator(source);
        obj.method();
    }

}
